package managedBeans;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;



import ejbs.TransactionsBean;

import model.Kunden;
import model.Reservierung;
import model.Zimmer;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@SessionScoped
@ManagedBean
public class ReservierungManagement {


	private List<SelectItem> lstAllZimmerItems = null;
	private List<SelectItem> lstZimmerItems = null;
	private List<SelectItem> lstKundenItems = null;
	private String reservierungVon ="20.02.2012", reservierungBis = "25.02.2012";
	private boolean resrvierungenFound =false;
	private String selectedKunde, selectedZimmer, selectedAllZimmer;
	@EJB
	private TransactionsBean transactionsBean;
	private String name;
	private float rabatt = 0;
	private int zahl;
	boolean checkAvailableZimmer = true;
	
	DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
	Calendar calendar = Calendar.getInstance();
	
	private Vector<Reservierung> reservierungen = new Vector<Reservierung>();
	private HtmlDataTable dtReservierung;
	
	public String startReservierungenSuchen(){
		loadAllZimmer();
		
		return("reservierungensuchen");
	}
	
	private void loadAllZimmer(){
		List<Zimmer> lstZimmer;
		lstAllZimmerItems = new ArrayList<SelectItem>();
		lstZimmer = transactionsBean.loadAllZimmern();
		for(Zimmer z : lstZimmer)
		{
			lstAllZimmerItems.add(new SelectItem(z.getId(), z.getName()));
		}
	}
	  
	public String startReservierung(){
	//	loadAvailableZimmer();
		loadAllKunden(); 
		
		return("reservierung");
	}
	 
	  
	public String search(){
		FacesContext ctx = FacesContext.getCurrentInstance();
		reservierungen.clear();
		//dtReservierung.clearInitialState();
		

		reservierungen = transactionsBean.searchReservierung( Integer.parseInt(this.selectedAllZimmer));
		if(reservierungen.size() > 0){
			this.resrvierungenFound = true;
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "es wurden "+ reservierungen.size() + " Reservierungen gefunden!","Success"));
		}
		else{ 
			this.resrvierungenFound = false;
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Es wurden keinen Reservierungen gefunden" , "Error"));
		}
		
		return("reservierungensuchen");
	}
	
	
	private void loadAvailableZimmer(){
		List<Zimmer> lstZimmer;
		lstZimmerItems = new ArrayList<SelectItem>();
		lstZimmer = transactionsBean.loadAllZimmern();
		for(Zimmer z : lstZimmer)
		{
			lstZimmerItems.add(new SelectItem(z.getId(), z.getName() + " - "+ z.getMaxBelegZahl()));
		}
	}
	
	private void loadAllKunden()       {
		List<Kunden> lstKunden;
		lstKundenItems = new ArrayList<SelectItem>();
		lstKunden = transactionsBean.loadAllKunden();  
		for(Kunden k : lstKunden){
			lstKundenItems.add(new SelectItem(k.getId(), k.getName()));
		}
	}

	public String checkZimmerAvailabilty(){   
		
		List<Zimmer> lstZimmer = new ArrayList<Zimmer>();
		lstZimmer = transactionsBean.getAvailableZimmer(zahl);
		
		if(lstZimmer != null){
			lstZimmerItems = new ArrayList<SelectItem>();
			
			for(Zimmer z : lstZimmer)
			{
				lstZimmerItems.add(new SelectItem(z.getId(), z.getName() + " - "+ z.getMaxBelegZahl()));
			}
			checkAvailableZimmer = false;
		}
		else{
			lstZimmerItems = new ArrayList<SelectItem>();
			checkAvailableZimmer = true;
		}
		
		return ("reservierung");
		
	}
	public String reserve() throws ParseException{
		String kundeId = selectedKunde;
		String zimmerId = selectedZimmer;
		
		Date dateVon = new Date();
		Date dateBis = new Date();
		
		
		dateVon = df.parse(reservierungVon);
		dateBis = df.parse(reservierungBis);
		
		Kunden kunde = transactionsBean.getKunde(Integer.parseInt(kundeId)); 
		Zimmer zimmer = transactionsBean.getZimmer(Integer.parseInt(zimmerId)); 

		Reservierung reservierung = new Reservierung();
		reservierung.setKunden(kunde);
		reservierung.setZimmer(zimmer);
		reservierung.setRabatt(rabatt);
		reservierung.setReservierungVon(dateVon);
		reservierung.setReservierungBis(dateBis);
		
		
		
		transactionsBean.saveReservation(reservierung);
		
		return "reservierung";
	}
	
	public String testReservation(){
		FacesContext ctx = FacesContext.getCurrentInstance();
		String _return = "";
		try {
			_return = transactionsBean.testReservation(df.parse(reservierungBis), zahl);
			
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "es wurden "+ _return + " Reservierungen gefunden!","Success"));
			
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		return "reservierung";
	}
	
	public String reservierungStornieren(){
		
		FacesContext ctx = FacesContext.getCurrentInstance();
		Reservierung r = (Reservierung) dtReservierung.getRowData();
		reservierungen.remove(r);
		
		
		if(transactionsBean.removeReservatin(r)){
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Die reservierung wurde erfolgreich storniert!","Success"));
		}else{
			ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, transactionsBean.getErr() , "Error"));	
		}
			
		
		if(reservierungen.size() > 0){
			resrvierungenFound = true;
		}else{
			resrvierungenFound = false;
		}
		
		return("reservierungensuchen");
	}
	
	

	public List<SelectItem> getLstZimmerItems() {
		return lstZimmerItems;
	}

	public void setLstZimmerItems(List<SelectItem> lstZimmerItems) {
		this.lstZimmerItems = lstZimmerItems;
	}

	public List<SelectItem> getLstKundenItems() {
		return lstKundenItems;
	}

	public void setLstKundenItems(List<SelectItem> lstKundenItems) {
		this.lstKundenItems = lstKundenItems;
	}

	public String getSelectedKunde() {
		return selectedKunde;
	}

	public void setSelectedKunde(String selectedKunde) {
		this.selectedKunde = selectedKunde;
	}

	public String getSelectedZimmer() {
		return selectedZimmer;
	}

	public void setSelectedZimmer(String selectedZimmer) {
		this.selectedZimmer = selectedZimmer;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getReservierungVon() {
		return reservierungVon;
	}

	public void setReservierungVon(String reservierungVon) {
		this.reservierungVon = reservierungVon;
	}

	public String getReservierungBis() {
		return reservierungBis;
	}

	public void setReservierungBis(String reservierungBis) {
		this.reservierungBis = reservierungBis;
	}

	public float getRabatt() {
		return rabatt;
	}

	public void setRabatt(float rabatt) {
		this.rabatt = rabatt;
	}

	public int getZahl() {
		return zahl;
	}

	public void setZahl(int zahl) {
		this.zahl = zahl;
	}

	public boolean isCheckAvailableZimmer() {
		return checkAvailableZimmer;
	}

	public void setCheckAvailableZimmer(boolean checkAvailableZimmer) {
		this.checkAvailableZimmer = checkAvailableZimmer;
	}

	public List<SelectItem> getLstAllZimmerItems() {
		return lstAllZimmerItems;
	}

	public void setLstAllZimmerItems(List<SelectItem> lstAllZimmerItems) {
		this.lstAllZimmerItems = lstAllZimmerItems;
	}

	public String getSelectedAllZimmer() {
		return selectedAllZimmer;
	}

	public void setSelectedAllZimmer(String selectedAllZimmer) {
		this.selectedAllZimmer = selectedAllZimmer;
	}

	public Vector<Reservierung> getReservierungen() {
		return reservierungen;
	}

	public void setReservierungen(Vector<Reservierung> reservierungen) {
		this.reservierungen = reservierungen;
	}

	public HtmlDataTable getDtReservierung() {
		return dtReservierung;
	}

	public void setDtReservierung(HtmlDataTable dtReservierung) {
		this.dtReservierung = dtReservierung;
	}

	public boolean isResrvierungenFound() {
		return resrvierungenFound;
	}

	public void setResrvierungenFound(boolean resrvierungenFound) {
		this.resrvierungenFound = resrvierungenFound;
	}


	
	
	
}
